#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 1000

int arr[2][MAX];       // 存放 array1 和 array2
int arrNum[2] = {0};    // 存放两个数组的长度
int result[MAX * MAX];  // 存放所有组合和
int resultNum = 0;

// 读取一行数据，跳过第一个数字（数组长度）
void readData(char *input, int i) {
    fgets(input, sizeof(char) * MAX, stdin);
    input[strcspn(input, "\n")] = 0;

    char *token = strtok(input, " ");
    int count = 0;

    // 第一个 token 是数组长度，跳过
    token = strtok(NULL, " ");
    while (token != NULL) {
        arr[i][count++] = atoi(token);
        token = strtok(NULL, " ");
    }

    arrNum[i] = count;
}

// 比较函数用于排序
int compare(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}

int main() {
    char input[MAX];
    int k, resultSum = 0;

    // 读取两行数据
    for (int i = 0; i < 2; i++) {
        readData(input, i);
    }

    // 读取 k 的值
    fgets(input, sizeof(char) * MAX, stdin);
    k = atoi(input);

    // 枚举所有组合并求和
    for (int i = 0; i < arrNum[0]; i++) {
        for (int j = 0; j < arrNum[1]; j++) {
            result[resultNum++] = arr[0][i] + arr[1][j];
        }
    }

    // 排序所有和
    qsort(result, resultNum, sizeof(int), compare);

    // 累加前 k 个最小和
    for (int i = 0; i < k; i++) {
        resultSum += result[i];
    }

    // 输出结果
    printf("%d\n", resultSum);
    return 0;
}
